<?php
/**
*@作者:MissZhang
*@邮箱:<787727147@qq.com>
*@创建时间:2021/7/3 上午9:43
*@说明:商品分类模型
*/
namespace app\common\model;
use think\facade\Db;
use think\Model;

class GoodsCategory extends Model
{
    protected $pk = "id";
    // 关闭时间戳自动写入
    protected $autoWriteTimestamp = false;
    public function getPkAttr() {
        return $this->pk;
    }
    public function scopeCateName($query, $search_key) {
        if ($search_key){
            $query->where('name', 'like', '%' . $search_key . '%');
        }
    }
    public function getShowTextAttr($value,$data) {
        if ($data['is_show']==1){
            return '是';
        }
        return '否';
    }
    public function getTypeTextAttr($value,$data) {
        $types = [1=>'会员专区',2=>'福利专区',3=>'特价专区',4=>'普通专区'];
        return $types[$data['type']];
    }
    /**
     * 获得指定分类下的子分类的数组
     * @access  public
     * @param   int     $cat_id     分类的ID
     * @param   int     $selected   当前选中分类的ID
     * @param   boolean $re_type    返回的类型: 值为真时返回下拉列表,否则返回数组
     * @param   int     $level      限定返回的级数。为0时返回所有级数
     * @return  mix
     */
    public function goods_cat_list($cat_id = 0, $selected = 0, $re_type = true, $level = 0)
    {
        global $goods_category, $goods_category2;
        //数据库表前缀
        $prefix=Config('database.connections.mysql.prefix');
        $sql = "SELECT * FROM  {$prefix}goods_category ORDER BY parent_id , sort ASC";
        $goods_category = DB::query($sql);
        $goods_category = convert_arr_key($goods_category, 'id');

        foreach ($goods_category AS $key => $value)
        {
            if($value['level'] == 1)
                $this->get_cat_tree($value['id']);
        }
        return $goods_category2;
    }

    /**
     * 获取指定id下的 所有分类
     * @global type $goods_category 所有商品分类
     * @param type $id 当前显示的 菜单id
     * @return 返回数组 Description
     */
    public function get_cat_tree($id)
    {
        global $goods_category, $goods_category2;
        $goods_category2[$id] = $goods_category[$id];
        foreach ($goods_category AS $key => $value){
            if($value['parent_id'] == $id)
            {
                $this->get_cat_tree($value['id']);
                $goods_category2[$id]['have_son'] = 1; // 还有下级
            }
        }
    }
    /**
     * @方法：将数据格式转换成树形结构数组
     * @param array $items 要进行转换的数组
     * return array $items 转换完成的数组
     */
    function getCatTree(Array $items) {
        $tree = array();
        foreach ($items as $item)
            if (isset($items[$item['parent_id']])) {
                $items[$item['parent_id']]['son'][] = &$items[$item['id']];
            } else {
                $tree[] = &$items[$item['id']];
            }
        return $tree;
    }
    /**
     * * 将树形结构数组输出
     * @param $items    要输出的数组
     * @param int $deep 顶级父节点id
     * @param int $type_id 已选中项
     * @return string
     */
    function exportTree($items, $deep = 0, $type_id = 0){
        $select="";
        foreach ($items as $item) {
            $select .= '<option value="' . $item['id'] . '" ';
            $select .= ($type_id == $item['id']) ? 'selected="selected">' : '>';
            if ($deep > 0) $select .= str_repeat('&nbsp;', $deep*4);
            $select .= '&nbsp;'.htmlspecialchars(addslashes($item['name'])).'</option>';
            if (!empty($item['son'])){
                $select .= $this->exportTree($item['son'], $deep+1,$type_id);
            }
        }
        return $select;
    }
    /**
     * 改变或者添加分类时 需要修改他下面的 parent_id_path  和 level
     * @global type $cat_list 所有商品分类
     * @param type $parent_id_path 指定的id
     * @return 返回数组 Description
     */
    public function refresh_cat($id)
    {
        //数据库表前缀
        $prefix=Config('database.connections.mysql.prefix');
        $cat=$this->find($id);
        // 刚新增的分类先把它的值重置一下
        if($cat['parent_id_path'] == '')
        {
            ($cat['parent_id'] == 0) && Db::execute("UPDATE {$prefix}goods_category set  parent_id_path = '0_$id', level = 1 where id = $id"); // 如果是一级分类
            Db::execute("UPDATE {$prefix}goods_category AS a ,{$prefix}goods_category AS b SET a.parent_id_path = CONCAT_WS('_',b.parent_id_path,'$id'),a.level = (b.level+1) WHERE a.parent_id=b.id AND a.id = $id");
            $cat=$this->find($id); // 从新找出他自己
        }

        if($cat['parent_id'] == 0) //有可能是顶级分类 他没有老爸
        {
            $parent_cat['parent_id_path'] =   '0';
            $parent_cat['level'] = 0;
        }
        else{
            $parent_cat = $this->find($cat['parent_id']); // 找出他老爸的parent_id_path
        }
        $replace_level = $cat['level'] - ($parent_cat['level'] + 1); // 看看他 相比原来的等级 升级了多少  ($parent_cat['level'] + 1) 他老爸等级加一 就是他现在要改的等级
        $replace_str = $parent_cat['parent_id_path'].'_'.$id;
        Db::execute("UPDATE `{$prefix}goods_category` SET parent_id_path = REPLACE(parent_id_path,'{$cat['parent_id_path']}','$replace_str'), level = (level - $replace_level) WHERE  parent_id_path LIKE '{$cat['parent_id_path']}%'");
    }
}